vprintf関数、vfprintf関数、vsprintf関数は、可変引数リストで指定した値を書式に従い、文字列に編集(変換)します。
これらの関数は可変引数リストを用いた点以外は、printf関数、fprintf関数、sprintf関数と同じです。
#include <stdio.h>
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int svprintf(char *str, const char *format, va_list ap);
*format(書式)は第3引数で指定する可変引数リストの値の編集形式を指定します。
apは可変引数リストを格納する領域を指定します。
*strは編集した結果を格納するための領域を指定します。
戻り値として、正常に出力できた場合は出力した文字数が、エラーの場合は負の値を返します。
*format(書式)はprintf関数やfprintf関数と同じですので、fprintf関数をご覧ください。また、可変引数リストに付いてはva_arg関数、va_start関数、va_end関数をご覧ください。
プログラム 例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>
void OutputLog(FILE *, int, ...); /* ログファイルの出力 */
char *GetDate(void); /* 実行日時の取得 */
char *StrChomp(char *); /* 改行削除 */
int main()
{
FILE *fp;
char message[100];
if ((fp = fopen('mess.log', 'a')) == NULL) {
fprintf(stderr, 'ログファイルが開けません\n');
abort();
}
OutputLog(fp, 2, 'var_printf', '開始');
while(1) {
printf('メッセージを入力してください ==> ');
fgets(message, 100, stdin);
StrChomp(message);
if (strcmp(message, 'end') != 0) {
OutputLog(fp, 1, message);
}
else {
break;
}
}
OutputLog(fp, 2, 'var_printf', '終了');
fclose(fp);
return 0;
}
/* ログファイルの出力 */
void OutputLog(FILE *p_fp, int p_num, ...)
{
va_list ap;
char format[50] = '%s';
int cnt;
fprintf(p_fp, '%s : ', GetDate());
/* 書式作成 */
for (cnt = 1; cnt < p_num; ++cnt) {
strcat(format, ' : %s');
}
strcat(format, '\n');
/* 可変引数リストの初期化 */
va_start(ap, p_num);
/* 可変引数リストの出力 */
vfprintf(p_fp, format, ap);
/* 可変引数リストのリセット */
va_end(ap);
}
/* 実行日時の取得 */
char *GetDate()
{
time_t t;
t = time(NULL);
return StrChomp(ctime(&t));
}
/* 改行削除 */
char *StrChomp(char *str)
{
char *str_p;;
for (str_p = str; *str_p; ++str_p)
;
if (*(str_p - 1) == '\n') {
*(str_p - 1) = '\0';
}
return str;
}
例の実行結果
$ ./var_printf.exe メッセージを入力してください ==> こんにちは。 メッセージを入力してください ==> 良いお天気ですね。 メッセージを入力してください ==> ご機嫌よう。 メッセージを入力してください ==> end $ $ ./var_printf.exe メッセージを入力してください ==> 今晩は。 メッセージを入力してください ==> お久しぶりです。 メッセージを入力してください ==> お休みなさい。 メッセージを入力してください ==> end $ $ cat mess.log Fri Jul 11 14:38:30 2008 : var_printf : 開始 Fri Jul 11 14:38:44 2008 : こんにちは。 Fri Jul 11 14:39:04 2008 : 良いお天気ですね。 Fri Jul 11 14:39:26 2008 : ご機嫌よう。 Fri Jul 11 14:39:32 2008 : var_printf : 終了 Fri Jul 11 14:40:24 2008 : var_printf : 開始 Fri Jul 11 14:40:50 2008 : 今晩は。 Fri Jul 11 14:41:05 2008 : お久しぶりです。 Fri Jul 11 14:41:45 2008 : お休みなさい。 Fri Jul 11 14:41:48 2008 : var_printf : 終了 $